#include <stdint.h>

#ifndef HEARDER_H
#define HEARDER_H

//ACK/NAK确认报文帧头
#define HEADER          0xfd
#define MAX_PACK_SIZE   128     //最大TLV数据包value大小
#define MIN_VALUE_SIZE  1       //最小的value大小
#define FIX_PACK_SIZE   5       //TLV固定大小且不包括value长度
#define MIN_PACK_SIZE   6       //最小HTLV大小（包括CRC）

/* 调试信息输出/关闭 */
//#define DEBUG                   //关闭调试信息，直接注释该语句
#ifdef  DEBUG
#define print_test      printf("func_name:%s, line:%d\n", __func__, __LINE__)    
#else   
#define print_test      do{}while(0)        //不打印任何信息（包括空格）
#endif 

enum
{
        Tag_id=1,	//0x01 	表示产品ID
        Tag_time,	//0x02	当前的系统时间；
        Tag_temper,	//0x03	当前温度值；
        Tag_ack,    //0x04  收到数据包确认报文；
        Tag_nak,    //0x05  未收到数据包请求重传报文
}; 

/* ACk/NAK的TLV中value值 */
static char    ack[1] = {0x15};
static char    nak[1] = {0x06};

//存放解析的id，温度和时间的TLV数据
typedef  struct tlv_total
{
    unsigned char    id[20];
    unsigned char    time[20];
    unsigned char    temper[10];
}tlv_data;


//用于TLV封包
typedef struct _tlv
{
    uint8_t     size;         //TLV的总大小
    char        tag;            //在union中方便取出tlv
    char        len;            //value的大小
    char        val[0];         //零长数组，通过动态分配内存
}tlv_s;

typedef union _union
{
    //注意不要直接通过结构体分配内存，定义枚举访问结构体成员  
    tlv_s           tlv;  //联合中需要注意字节对齐      
    unsigned char   buf[MAX_PACK_SIZE];
}union_s;


union_s *tlv_pack(unsigned char Tag, uint8_t len, char *src_buf);
int tlv_unpack(unsigned char *src_buf, int *left_byte, tlv_data *tlv_val, int* tlv_flag);

#endif
